#include <stdlib.h>
#include <stdint.h>
#include <unistd.h>
#include <strings.h>

#include "common.h"
#include "tlb.h"

#include <assert.h>

int main(int argc, char *argv[]) {
	TLB tlb;
	tlb_error err;

	assert(create_tlb(&tlb, 127) == E_OKAY);

	tlb_vaddr addr;
	tlb_vaddr asid;
	tlb_vaddr mask;
	tlb_paddr frame0;
	tlb_paddr frame1;
	tlb_vaddr flags;

	mask = 0;
	asid = 0xAB;

	tlb_vaddr i;
	for(i=0; i<127; i++) {
		addr = 2*i << 13 | asid;
		frame0 = 2*i << 14;
		frame1 = 2*i+1 << 14;
		if(2*i == 10)
			frame0 |= PFN_GLOBAL;
		assert(tlb_set(&tlb, i, addr, mask, frame0, frame1) == E_OKAY);
	}
	
	assert(tlb_search(&tlb, 2 << 13, &i) == E_TLB_MISS);
	assert(tlb_search(&tlb, 2 << 13 | 0xAB, &i) == E_TLB_HIT);
	assert(i == 1);
	
	assert(tlb_lookup(&tlb, 1 << 13, 0, &frame0, &flags) == E_TLB_MISS);
	assert(tlb_lookup(&tlb, 10 << 13, 0, &frame0, &flags) == E_TLB_HIT);
	assert(frame0 == (10 << 14) | PFN_GLOBAL);

	assert(tlb_lookup(&tlb, 3 << 13, 0xAB, &frame0, &flags) == E_TLB_HIT);
	assert(flags == 0);
	assert(frame0 == (3 << 14));

	return 0;
}
